package com.qf.service;

import com.qf.dao.CartDao;
import com.qf.dao.CartDaoImpl;
import com.qf.dao.GoodsDao;
import com.qf.dao.GoodsDaoImpl;
import com.qf.pojo.Cart;
import com.qf.pojo.Goods;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 孙亚梅
 * @version V1.0
 * @Project javase2203
 * @Package com.qf.service
 * @Description:
 * @Date 2022/5/25 19:53
 */
public class CartServiceImpl implements CartService {


    @Override
    public boolean createCart(Integer uid, Integer pid) {
        //1:根据用户id和商品id，到数据库中查询是否已经有这个商品的数据
        CartDao cartDao = new CartDaoImpl();
        Cart cart = cartDao.findCartByUidAndPid(uid,pid);

        //根据商品id,查询商品对象
        GoodsDao goodsDao = new GoodsDaoImpl();
        Goods goods = goodsDao.findById(pid);

        if (cart != null){
                //2：判断如果能够查询到这个购物项数据，进行购买数量的添加
               //购买件数加1
                cart.setNum(cart.getNum()+1);
            //将商品对象放入购物车中
            cart.setGoods(goods);
                //重新计算总价钱 = 商品的购买数量*商品单价
                cart.setMoney(cart.getNum()*goods.getPrice());

                //调用dao，将最新的购物数据更新到表中
            cartDao.updateCart(cart);
            }else {
                //3;判断如果查不到这个购物项的数据，那么作为新的购物项添加到数据库中
              //因为cart购物车为null，所以需要new创建购物车对象
                cart = new Cart();
               //用户id
                cart.setUid(uid);
                //商品id
                cart.setPid(pid);
                //购买数量
                cart.setNum(1);
                //将商品对象放入购物车中
                cart.setGoods(goods);
                //总价钱 =购买数量*商品单价
                cart.setMoney(cart.getNum()*goods.getPrice());

                cartDao.insercart(cart);
           }

        return true;
    }

    @Override
    public List<Cart> findCartListByUid(Integer uid) {
        //根据用户id，查询购物车集合
       CartDao cartDao = new CartDaoImpl();
        List<Cart> cartList= cartDao.findCartListByUid(uid);

        //查询所有商品数据
        GoodsDao goodsDao = new GoodsDaoImpl();
        List<Goods> goodsList = goodsDao.findGoodsAll();

//        //这种做法效率慢，因为遍历次数是cartList集合的个数 乘以 goodsList集合的个数
////        //遍历
////        if (cartList != null){
////            //遍历购物车集合
////            for (Cart cart : cartList){
////               //遍历商品集合
////               for (Goods goods :goodsList){
////                   if (cart.getPid()== goods.getId()){
////                       //将商品对象放入购物车项对象中
////                       cart.setGoods(goods);
////                   }
////               }
////            }
////        }
        /**
         *  优化方案，优化代码执行效率，遍历次数=cart List集合中的个数+goods List集合中的个数
         *  1:将数据量多的集合，放入Map<String，Good>中
         *  2:遍历另一个集合，在遍历的过程中，直接从map中get数据
         * 时间空间复杂度:
         * 时间: 程序执行的快慢可以用时间来表示, 执行的时间越少, 说明执行效率越高, 代码越优秀
         * 空间: 程序存储需要占用磁盘或者内存空间, 当然是占用的越少越好.
         * List 时间复杂度 S=O(n) 代表list中取数据, n代表list中元素的个数, 元素越多获取效率越慢
         * Map  时间复杂度 S=O(1) 代表map中取数据, 1代表map中不管有多少元素个数, 只需要一次就可以获取到
         */
        Map<String,Goods> goodsMap = new HashMap<String, Goods>();
        if (goodsList != null){
            for (Goods goods : goodsList){
                //以商品id作为key,以商品对象作为value
                goodsMap.put(String.valueOf(goods.getId()),goods);
            }
        }
        if (cartList != null){
            for (Cart cart : cartList){
                Goods goods = goodsMap.get(String.valueOf(cart.getPid()));
                if (goods != null){
                    //如果商品对象不为空，那么放入购物车对象中
                    cart.setGoods(goods);
                }
            }
        }
        return cartList;
    }
    public  void  updateCart(Integer cid,Integer num){
        //1. 根据cid, 到数据库查询这个购物项的数据
        CartDao cartDao = new CartDaoImpl();
        Cart cart = cartDao.findById(cid);

        //2. 根据查询到的购物项的, 商品id, 到商品表中查询对应的商品数据
        GoodsDao goodsDao = new GoodsDaoImpl();
        Goods goods = goodsDao.findById(cart.getPid());


        //3. 从新计算总价 = 商品单价 * 商品购买数量
        cart.setNum(num);
        cart.setGoods(goods);
        cart.setMoney(goods.getPrice() * num);
        cartDao.updateCart(cart);


    }

    @Override
    public void deleteById(Integer id) {
        CartDao cartDao = new CartDaoImpl();
        cartDao.deleteById(id);
    }
}
